package es.cea.carritocompra.container;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.management.relation.RoleResult;
import javax.management.relation.RoleStatus;

import es.cea.carritocompra.anotaciones.ComprobarRegistro;
import es.cea.carritocompra.anotaciones.RolUsuario;
import es.cea.carritocompra.excepciones.RegistroException;
import es.cea.carritocompra.excepciones.RegistroRolException;
import es.cea.carritocompra.model.UsuarioWeb;
import es.cea.core.util.ContenedorComponentesEJBBase;

public class ContenedorComponentesEJB extends ContenedorComponentesEJBBase implements InvocationHandler {

	public static <T> T nuevoComponente(Class<T> claseDeInstancia) {
		try {
			Object instancia = claseDeInstancia.newInstance();
			ClassLoader classLoader = instancia.getClass().getClassLoader();
			Class[] interfaces = instancia.getClass().getInterfaces();
			InvocationHandler ejemploProxy = new ContenedorComponentesEJB(instancia);
			return (T) Proxy.newProxyInstance(classLoader, interfaces, ejemploProxy);
		} catch (Exception e) {
			throw new RuntimeException("error al crear un nuevo componente de tipo:" + claseDeInstancia.getSimpleName());
		}
	}

	private ContenedorComponentesEJB(Object instancia) {
		setObjetoGestionado(instancia);
	}

	private void setObjetoGestionado(Object instancia) {
		// TODO Auto-generated method stub
		
	}

	public Object invoke(Object proxy, Method metodo, Object[] args) throws Throwable {
		System.out.println("invocando metodo" + metodo.getName() + " cliente registrado" + usuarioWeb.isRegistrado());
		Annotation anotacionRegistro = existeAnotacion(metodo, ComprobarRegistro.class);

		if (anotacionRegistro != null)
			if (!usuarioWeb.isRegistrado()) {
				throw new RegistroException();

			} else {
				RolUsuario rol = (RolUsuario) anotacionRegistro.getClass().getMethod("rol").invoke(anotacionRegistro);
				if(!usuarioWeb.getRolUsuario().equals(rol)){ 
					Throwable throwable = new Throwable(new RegistroRolException());
					
					throw throwable;
				}
				System.out.print(rol);
			}

		Object resultado = metodo.invoke(getObjetoGestionado(), args);

		System.out.println("despues de invocar el metodo: " + metodo.getName());
		return resultado;
	}

	private Annotation existeAnotacion(Method metodo,
			Class<ComprobarRegistro> class1) {
		// TODO Auto-generated method stub
		return null;
	}

	private Object getObjetoGestionado() {
		// TODO Auto-generated method stub
		return null;
	}

	public static UsuarioWeb usuarioWeb;
	public static Object objetoGestionado;

}
